/*
 * Copyright 2010 Michael Nitsche
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package de.mnit.schnipsel.zentral;

import org.eclipse.swt.graphics.Rectangle;

import de.mnit.basis.daten.MN;
import de.mnit.basis.daten.struktur.S_Folge;
import de.mnit.basis.daten.struktur.tabelle.S_Tabelle;
import de.mnit.basis.daten.typ.zeit.S_Datum;
import de.mnit.basis.fehler.Fehler;
import de.mnit.basis.fehler.system.F_Sys_Datei;
import de.mnit.basis.fehler.system.F_Sys_InOut;
import de.mnit.basis.fehler.system.F_Sys_Sicherheit;
import de.mnit.basis.swt.dialog.SWT_Dialog;
import de.mnit.basis.swt.dialog.SWT_Fehler;
import de.mnit.basis.swt.druck.SWT_DruckAuftrag;
import de.mnit.basis.swt.vorlage.A_AnwZ_Events;
import de.mnit.basis.sys.Ausgabe;
import de.mnit.basis.sys.datei.DateiText;
import de.mnit.basis.sys.datei.S_Datei;
import de.mnit.basis.sys.sprache.S;
import de.mnit.schnipsel.db.B_Schnipsel;
import de.mnit.schnipsel.db.DBManager;
import de.mnit.schnipsel.div.HTML_Export;
import de.mnit.schnipsel.div.KonfigLokal;
import de.mnit.schnipsel.swt.K_Anzeige;
import de.mnit.schnipsel.swt.baum.BAUMAKTION;
import de.mnit.schnipsel.swt.baum.K_Baum;
import de.mnit.schnipsel.swt.dialog.Dialog_Speichern;
import de.mnit.schnipsel.swt.dialog.K_Ablauf;
import de.mnit.schnipsel.swt.dialog.konfig.K_Konfig;
import de.mnit.schnipsel.swt.editor.basis.TextEditor;

/**
 * @author Michael Nitsche
 */
public class SC_Events extends A_AnwZ_Events {

	private static final S s=new S(SC_Events.class);
	private static SC_Events instanz=null;


	public static SC_Events i() {
		if(instanz==null)
			instanz=new SC_Events();
		return instanz;
	}

	public static void htmlExport(Integer baum) {
		HTML_Export html=new HTML_Export();
		html.export(baum);
	}

	public static void papierkorbLeeren() {
		S_Tabelle<String> eintraege=DBManager.schnipsel().gTabMuell();
		int anzahl=eintraege.gLaenge();
		Ausgabe.debug(anzahl);
		if(anzahl==0) {
			SWT_Dialog.hinweis(s.t("Der Papierkorb ist leer"));
			return;
		}
		Boolean ok=SWT_Dialog.frage_JaNein(s.t("Wirklich alle "+anzahl+" Einträge im Papierkorb löschen?"));
		if(MN.istTrue(ok))
			for(String id : eintraege.gSpalte(2))
				DBManager.schnipsel().minus(Integer.parseInt(id), true);
	}

	public void neuVerbinden() { // TODO: Wäre auch dezentral möglich
		DBManager.verbinden();
		SC_GuiObs.i().baum().neuLaden();
		SC_GuiObs.i().baum().sAlle();
		SC_GuiObs.i().liste().anzeigenSuche("");
	}

	public static void schnipselPlus() {
//		SC_GuiObs.i().suche().sLeer();
//		SC_GuiObs.i().liste().anzeigenSuche("");

		K_Baum baum =SC_GuiObs.i().baum();
		Integer id=SC_GuiObs.i().baum().gAuswahlID();
		if(id!=null && id<0 && id!=BAUMAKTION.ALLE.id) {
			baum.sAlle();
			SC_GuiObs.i().liste().anzeigenSuche("");
			SC_GuiObs.i().suche().sLeer();
		}

		SC_GuiObs.i().anzeige().sID(null);
	}

	public static void schnipselMinus() {
		S_Folge<Integer> ids=SC_GuiObs.i().liste().gAuswahlIDs();
		for(Integer id : ids) {
			B_Schnipsel schnipsel;
			try {
				schnipsel = DBManager.schnipsel().gEintragB(id);
			}
			catch(F_Sys_Sicherheit e) {
				SWT_Fehler.neu(s.t("Eintrag konnte nicht entfernt werden!"), false);
				return;
			}
			Boolean muell=schnipsel.MUELL.g();
			boolean loeschen=muell!=null && muell;
			DBManager.schnipsel().minus(id, loeschen); // Wenn bereits im Müll, dann komplett löschen
		}
		SC_GuiObs.i().liste().aktualisieren();
//		SC_GuiObs.i().anzeige().sID(null); //Wird über Liste sauber gelöst!
	}

	public static void schnipselSpeichern() {
		SC_GuiObs.i().anzeige().speichern();
	}

	public static void zeigArtikel(Integer id, boolean alle) {
//		Ausgabe.debug("zeig: "+id+"  "+alle);
		if(alle) {
			SC_GuiObs.i().baum().sAlle();
			SC_GuiObs.i().liste().anzeigenSuche("");
			SC_GuiObs.i().liste().sAuswahl(id);
		}
		SC_GuiObs.i().anzeige().sID(id);
		Integer ast= id==null ? null : DBManager.schnipsel().gAst(id);
		SC_GuiObs.i().baum().sHintergrund(ast);
	}

	public static void schnipselDrucken() { //TODO druckenSchnipsel wird noch irgendwo direkt aufgerufen!!!
		SWT_DruckAuftrag druck=new SWT_DruckAuftrag(s.t("Schnipsel"), SC_GuiObs.i().anwendung().swt().getShell());
		druck.sRand(1.5, 1.5, 1.5, 1.5);
		druck.druckenSchnipsel(SC_GuiObs.i().anzeige().gEditor());
	}

	public static void beenden(boolean swt) {
		Ausgabe.debug("Ende");
		SC_GuiObs.i().anzeige().speichernEnde();
		SC_GuiObs.i().liste().speichernEnde();
		DBManager.i().schliessen();
		try {
			Rectangle r=SC_GuiObs.i().hauptfenster().swt().getBounds();
			KonfigLokal.i().anwBreite(r.width-SC_GuiObs.i().anwendung().korr_breite.g());
			KonfigLokal.i().anwHoehe(r.height-SC_GuiObs.i().anwendung().korr_hoehe.g());
			KonfigLokal.i().schliessen();
		}
		catch(F_Sys_InOut e) {
			Fehler.zeig(e, false);
		}
		if(swt)
			SC_GuiObs.i().anwendung().schliessen();
	}

	public static void export(TextEditor editor) {
		try {
			Dialog_Speichern ds=new Dialog_Speichern();
			S_Datei datei=ds.gErgebnis(SC_GuiObs.i().hauptfenster());
			if(datei==null)
				return;
			iExport(editor, datei);
		} catch(F_Sys_Datei e) {
			SWT_Fehler.zeig(e, false);
		}
	}

	public static void konfig() {
		K_Konfig k=new K_Konfig();
		k.oeffnen(SC_GuiObs.i().hauptfenster());
		Ausgabe.debug();
	}

	/** Ergebnis null=nicht gesetzt, true=Datum wurde geändert oder gesetzt, false=Gesetzt aber nicht verändert **/
	public static Boolean ablaufDatum() {
		K_Anzeige anzeige=SC_GuiObs.i().anzeige();
		K_Ablauf k=new K_Ablauf();
		S_Datum startwert=anzeige.gAblauf();
		k.setze(startwert);
		S_Datum auswahl=k.gErgebnis(SC_GuiObs.i().hauptfenster());
		anzeige.sAblauf(auswahl);
		return auswahl==null ? null : !MN.istGleich(auswahl, startwert);
	}


	protected void initEvents() {
	}

	private static void iExport(TextEditor editor, S_Datei datei) throws F_Sys_Datei {
		if(datei.existiert()) {
			Boolean b=SWT_Dialog.frage_JaNein("\""+datei.gNameKomplett()+"\"\nwirklich überschreiben?");
			if(!MN.istTrue(b))
				return;
		}

		String suffix=datei.gEndung();
		if(suffix.equalsIgnoreCase("rtf"))
			Fehler.sonstige.da_ToDo();
		else if(suffix.equalsIgnoreCase("htm") || suffix.equalsIgnoreCase("html"))
			DateiText.setze(datei, "<html>\n<head></head>\n<body>\n"+editor.gHTML()+"\n</body>\n</html>\n"); //FIXME: Arbeitet noch nicht richtig!
		else if(suffix.equalsIgnoreCase("pdf"))
			Fehler.sonstige.da_ToDo();
		else if(suffix.equalsIgnoreCase("txt"))
			DateiText.setze(datei, editor.gTextUndFormat().g1());
		else {
			datei.sEndung("html");
			iExport(editor, datei);
		}
	}

}
